package cn.fl.project.service;

import cmm.mid.core.framework.page.DataResultVO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cn.cmm.base.framework.exception.BaseException;
import cn.fl.project.condition.PrjPrdPaySchMQueryCondition;
import cn.fl.project.dto.PrjPrdPaySchMDTO;
import cn.fl.project.vo.PrjMfrPrdPaySchMVO;
import cn.fl.project.vo.PrjPrdPaySchMVO;
import cn.fl.project.vo.PrjPrdPaySchTagVO;
import cn.fl.system.vo.SysDictionaryVO;

import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.List;

/**
 * @Description: 项目产品支付表主信息表 客户端服务层接口
 * 业务层方法名称前缀：
 * 新增：add*
 * 删除：remove*
 * 修改：modify*
 * 批量：batch*
 * 查询对象：select* get*
 * 查询集合：search*
 */
public interface IPrjPrdPaySchMService {
	
	/**
	 * 获取唯一对象
	 * @param id 主键
	 * @return 对象DTO
	 */
	public PrjPrdPaySchMVO selectById(Long id) throws BaseException;

	/**
	 * 查询与我司指定支付表ID同设备的支付表主信息
	 * <p>
	 *
	 * @param paySchId 支付表ID
	 * @return
	 * @throws BaseException
	 */
    List<PrjPrdPaySchMDTO> searchTheSamePrdOtherPaySchMList(Long paySchId) throws BaseException;

    /**
	 * 新增
	 * @param entity
	 * @return
	 */
    public Long add(PrjPrdPaySchMVO entity) throws BaseException;
    
    /**
     * 批量删除
     * @param ids
     * @return
     */
    public boolean removeByIds(List<Long> ids) throws BaseException;

    /**
     * 修改
     * @param entity
     * @return
     */
    public boolean modify(PrjPrdPaySchMVO entity) throws BaseException;
    /*
     * 保存起租日（仅根据id保存单个值）
     */
    public void modifylsDt(Long ids, Date lsDts) throws BaseException;
    
    
    public boolean modifyLsDt(PrjPrdPaySchMVO entity) throws BaseException;

    /**
     * 分页查询所有
     * @param page
     * @return
     */
    public Pager searchListPage(Pager page) throws BaseException;
    
    /**
     * 根据条件查询所有
     * @param condition
     * @return
     */
    public List<PrjPrdPaySchMVO> searchList(PrjPrdPaySchMQueryCondition condition) throws BaseException;


	/**
	 * 根据客户经理查询项目产品信息
	 * @param condition
	 * @return
	 * @throws BaseException
	 */
	public List<PrjPrdPaySchMVO> selectPrjPrdList(PrjPrdPaySchMQueryCondition condition) throws BaseException;
	/**
	 * 查询项目产品支付表和支付表明细
	 * @param valueOf
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO selectPrjPrdPaySchMAndDetailById(Long id)throws BaseException;
    /**
     * 查询项目产品支付表和支付表明细(资管支付表详情页面)
     * @param valueOf
     * @return
     * @throws BaseException
     */
    public PrjPrdPaySchMVO selectPrjPrdPaySchMEnableAndDetailById(Long id)throws BaseException;
	/**
	 * 重新测算
	 * @param entity
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO prjQuatPrpsCalculate(PrjPrdPaySchMVO entity)throws BaseException;
	/**
	 * 测算获取测算后数据
	 * @param prjPrdId
	 * @param prjPrdDtlId
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO initPrjPrdPaySchMCalculate(Long prjId,Long prjPrdId, Long prjPrdDtlId)throws BaseException;
	
	/**
	 * 设置还款日期，计算每一期的还款日期
	 * @param prjPrdId  产品支付表ID
	 * @param payDate 还款日期
	 * @throws BaseException
	 */
	public void setPrjPrdSchMPayDate(Long prjPrdPayId, Date payDate)throws BaseException;
	
	/**
	 * 设置更改起租日期，重新设置还款日期
	 * @param prjPrdId 产品支付表ID
	 * @param rentDate
	 * @throws BaseException
	 */
	public void modifyPrjPrdSchMPayDate(Long prjPrdPayId, Date rentDate)throws BaseException;
	/**
	 * 支付表管理
	 * @param page
	 * @return
	 * @throws BaseException
	 */
	public Pager selectPrjPrdPaySchMMgrListPage(Pager page)throws BaseException;
    /**
     * 资方支付表管理
     * @param page
     * @return
     * @throws BaseException
     */
    public Pager selectPrjPrdZfPaySchMMgrListPage(Pager page)throws BaseException;
	/**
	 * 导出起租说明书
	 * @param paySchId
	 * @param out
	 * @throws BaseException
	 */
	public void exportRentNotice(Long paySchId, ByteArrayOutputStream out)throws BaseException;
	/**
	 * 导出支付表首期明细
	 * @param paySchId
	 * @param out
	 * @throws BaseException
	 */
	public void exportFirstPayAmt(Long paySchId, ByteArrayOutputStream out)throws BaseException;
	/**
	 * 导出支付表信息
	 * @param paySchId
	 * @param out
	 * @throws BaseException
	 */
	public void exportPrjPrdPaySch(Long paySchId, ByteArrayOutputStream out)throws BaseException;
	/**
	 * 获取结清数据
	 * @param paySchId
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO searchSettleData(Long paySchId,Date applyDate,Integer payPd)throws BaseException;
	/**
	 * 资金流向
	 * @return
	 * @throws BaseException
	 */
	public   List<SysDictionaryVO> getSettFeeTypList()throws BaseException;
	/**
	 * 发起正常结清流程
	 * @param pay
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO addFileAndApplyNormalSett(PrjPrdPaySchMVO pay)throws BaseException;
	/**
	 * 发起提前结清流程
	 * @param pay
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO addFileAndPreNormalSett(PrjPrdPaySchMVO pay)throws BaseException;
	/**
	 * 提前结清
	 * @param paySchId
	 * @param date
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO searchPreSettleData(Long paySchId, Date date,Integer settPayPd)throws BaseException;

	/**
	 * 获取结清开始期数
	 */
	public PrjPrdPaySchMVO getPrjPrdPaySettPayPd(Long paySchId, String sett,Date settDate) throws BaseException;

	/**
	 * 校验是否能发起结清流程
	 * @param paySchId 我司支付表ID
	 * @param sett     结清类型标识：normal：正常结清；pre：提前结清
	 * @return
	 * @throws BaseException
	 */
	/**
	 * 校验是否能发起结清流程
	 * @param paySchId 我司支付表ID
	 * @param sett     结清类型标识：normal：正常结清；pre：提前结清
	 * @return
	 *    1-我司结清
	 *    2-资管结清
	 * @throws BaseException
	 */
	public int prjPrdPayApplySettFlag(Long paySchId, String sett) throws BaseException;
	/**
	 * 导出Excel数据
	 * @param valueOf
	 * @param out
	 * @throws BaseException
	 */
	public void exportPrjPrdPaySchExcelData(Long valueOf, ByteArrayOutputStream out)throws BaseException;
	/**
	 * 获取删除的支付表数据
	 * @param page
	 * @return
	 * @throws BaseException
	 */
	public Pager selectPrjPrdPaySchMDelMgrListPage(Pager page)throws BaseException;
	/**
	 * 乘用车的提前结清
	 * @param paySchId
	 * @param date
	 * @param payPd
	 * @return
	 * @throws BaseException
	 */
	
	public PrjPrdPaySchMVO searchCarPreSettleData(Long paySchId, Date date, Integer payPd)throws BaseException;
	/**
	 * 过了财务节点流程中的页面
	 * @param paySchId
	 * @param applyDate
	 * @param payPd
	 * @return
	 */
	public PrjPrdPaySchMVO searchSettleDataForFlow(Long paySchId, Date applyDate, Integer payPd);

	/**
	 * 修改工行账户
	 * @author jiangzg 2017-10-18 17:54:14
	 * @param entity
	 * @return
	 */
	public boolean modifyCrCardNo(PrjPrdPaySchMVO entity) throws BaseException;
	
	/**
	 * 汽车金融正常结清
	 * @param paySchId
	 * @param applyDate
	 * @param settPayPd
	 * @param sysCd
	 * @param orgCd
	 * @return
	 * @throws BaseException
	 */
	public PrjPrdPaySchMVO searchCarNormalSettleData(Long paySchId, Date applyDate, Integer settPayPd) throws BaseException;
	/**
	 * 汽车金融提前结清流程
	 * @param pay
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO addFileAndApplyCarNormalSett(PrjPrdPaySchMVO pay)throws BaseException;
	
	/**
	 * 提前结清
	 * @param paySchId
	 * @param applyDate
	 * @param payPd
	 * @return
	 * @throws BaseException
	 */
    public PrjPrdPaySchMVO searchCarNormalSettleDataForFlow(Long paySchId, Date applyDate, Integer payPd)throws BaseException;
    /**
     * 检查第二张支付表的结清金额
     * @param paySchId
     * @param setAmt
     * @return
     * @throws BaseException
     */
	public boolean checkNormalPaySchSettAmt(Long paySchId, Long setAmt)throws BaseException;
	/**
	 * 检查第二张支付表的结清金额
	 * @param paySchId
	 * @param setAmt
	 * @return
	 * @throws BaseException
	 */
	public boolean checkPrePaySchSettAmt(Long paySchId, Long setAmt)throws BaseException;
	/***
	 * 车立行结清查询
	 * @param paySchId
	 * @param applyDate
	 * @param payPd
	 * @return
	 * @throws BaseException
	 */
    public PrjPrdPaySchMVO searchPrjPrdSchTMSettleDataForQCJR(Long paySchId)throws BaseException;
    /**
     * 修改起租日
     * @param schMVO
     * @return
     * @throws BaseException
     */
	public boolean modifyPrjPrdSchMPayDate(PrjPrdPaySchMVO schMVO)throws BaseException;
	/**
	 * 结清比例金额
	 * @return
	 * @throws BaseException
	 */
	public List<KeyValueVO> selectSettPctList()throws BaseException;
	/**
	 * 项目产品的资产状态列表
	 * @return
	 * @throws BaseException
	 */
	public List<KeyValueVO> selectPrjPrdStatusList()throws BaseException;
	
	 /**
	  * 设置工行起租日信息
	  * @param prjPrdPayId
	  * @param firstPayDate
	  * @param currBuOrgCd
	  * @throws BaseException
	  */
    public boolean modifySetPrjPrdSchMGHPayDate(Long prjPrdPayId, Date firstPayDate)throws BaseException;
	/**
	 * 风控策略结果
	 * @throws BaseException
	 */
	public String riskControlResults(Long cstId , Long lnkCompId) throws BaseException;

	/**
	 * 根据项目id查询客户保证金
	 * @param prjId
	 * @return
	 */
	public Long searchAramtByPrjId(Long prjId) throws BaseException;

	/**
	 * 根据项目id查询剩余本金
	 * @param prjId
	 * @return
	 * @throws BaseException
	 */
	public Long selectRestCorpus(Long prjId) throws BaseException;
	/**
	 * 单条数据修改
	 * @param schMVO
	 * @return
	 * @throws BaseException
	 */
	public boolean modifyEntity(PrjPrdPaySchMVO schMVO)throws BaseException;
    /**
     * 导出支付表
     * @param payId
     * @return
     * @throws BaseException
     */
	public DataResultVO exportPrjPrdPaySchExcelDataNew(Long payId)throws BaseException;
	/**
	 * 导出起租提醒
	 * @param payId
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO exportRentNoticeNew(Long payId)throws BaseException;
	/**
	 *导出首期款信息
	 * @param payId
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO exportFirstPayAmtNew(Long payId)throws BaseException;
    /**
     *厂商支付表明细信息
     * @param schMId
     * @return
     * @throws BaseException
     */
    public PrjMfrPrdPaySchMVO selectPrjMfrPrdPaySchMAndDetailById(Long schMId)throws BaseException;

	/**
	 * 车辆检测报告分页查询所有
	 * @param page
	 * @return
	 */
	public Pager searchVehDetectionListPage(Pager page)throws BaseException;

	/**
	 * 生成人保资料信息
	 * @param paySchId
	 * @return
	 * @throws BaseException
	 */
	public DataResultVO addFileRec(Long prjId)throws BaseException;

	/**
	 * 设置支付表标签
	 * @param entity
	 * @return
	 */
	public Long sitePaySchNoTag(PrjPrdPaySchTagVO entity) throws BaseException;

	public PrjPrdPaySchMVO searchCashDepositDeductionPaySchD(Long paySchId, Integer payPd) throws BaseException;

	PrjPrdPaySchMVO selectByIdWithoutDel(Long id) throws BaseException;

	/**
	 * 结清按钮权限（只针对我司结清流程）
	 * @param paySchId
	 * @return
	 * @throws BaseException
	 */
    int settleAuthority(Long paySchId) throws BaseException;
}
